from django.shortcuts import render
from django.views import View
from meiduo_mall.utils.meiduo_category import get_categories
from .models import GoodsCategory, SKU
from django.core.paginator import Paginator
from . import constants
from django import http
from meiduo_mall.utils.response_code import RETCODE


class ListView(View):
    def get(self, request, category_id, page_num):
        # 查询第三级分类对象
        try:
            category3 = GoodsCategory.objects.get(pk=category_id)
        # 如果没查到返回404页面
        except:
            return render(request, '404.html')

        # 分类数据
        categories = get_categories()
        # 面包屑导航
        #
        category2 = category3.parent
        category1 = category2.parent
        breadcrumb = {
            'cat1': {
                'name': category1.name,
                # 获取类的名称下的路由（类名称要用小写）类名称小写——get获取
                'url': category1.goodschannel_set.all()[0].url
            },
            'cat2': category2,
            'cat3': category3
        }

        # 热销排行 使用ajax查询，此视图不做查询
        # 当前分类数据
        # 已知当前对象，获取当前属性的
        skus = category3.sku_set.filter(is_launched=True)
        # 排序 需要接收排序规则
        sort = request.GET.get('sort', 'default')

        # 默认  default
        # 价格 price
        # 人气 hot
        if sort == 'hot':
            # 按照销量多到少排序，前边加-号
            skus = skus.order_by('-sales')
        elif sort == 'price':
            skus = skus.order_by('price')
        else:
            # 默认把最新的放前边，id是唯一的，按照从小到大排序，所以是-id
            skus = skus.order_by('-id')

        # 分页  数据量比较大，可以部分展示，做分页
        # 创建分页对象
        paginator = Paginator(skus, constants.LIST_PER_PAGE)
        page_skus = paginator.page(page_num)
        # 获取指定页的数据
        context = {
            #
            'categories': categories,
            #
            'breadcrumb': breadcrumb,
            # 分页
            'page_skus': page_skus,
            # 三级分类
            'category': category3,
            # 排序功能
            'sort': sort,
            # 当前页
            'page_num': page_num,
            # 一共多少页 分页函数
            'total_page': paginator.num_pages
        }
        return render(request, 'list.html', context)


class HotView(View):
    # category_id 获取分类的id
    def get(self, request, category_id):
        # 查询2个最热销的商品
        skus = SKU.objects.filter(is_launched=True, category_id=category_id).order_by('-sales')[0:2]

        # 格式转换 将格式转换为json格式，返回给前端
        hot_sku_list = []
        for sku in skus:
            hot_sku_list.append({
                'id': sku.id,
                'name': sku.name,
                'default_image': sku.default_image,
                'price': sku.price
            })

        # 响应 返回json格式数据
        return http.JsonResponse({
            'code': RETCODE.OK,
            'errmsg': 'ok',
            'hot_skus': hot_sku_list
        })


